GitHub Actionsを使ってGitHubリポジトリをCodeCommitリポジトリへミラーリングする
CodeCommitからCodePipelineを動かす必要があるけど、GitHubでコードを管理したいケースがあったのでやってみます。ミラーリング自体は多くの記事がでていたのですが、CodePipelineと連携したときの動きを確認したいこともあり試してみました。
前提
- CodeCommitのリポジトリを作成済み
- GitHubのリポジトリを作成済み
- CodeCoommit用のIAMユーザーを作成済み
やってみる
CodeCommitのSSHキーをアップロードする
GitHubからCodeCommitへミラーリングする際の認証情報としてSSHキー使用するためアップロードが必要です。
今回は以下のシェルでパッと作成してアップロードしました。ここで作成する鍵はパスフレーズなしで作成します。
シェルで指定したIAMユーザーの認証情報タブから、 AWS CodeCommit の SSH キー 欄を確認するとアップロードされていることを確認できます。
ここでは塗りつぶしていますが、SSHキーのIDを控えておきましよう。
GitHubのリポジトリにSecretsを設定する
認証情報をSecretsに設定していきます。
GitHubリポジトリのSettings>Secrets>Actionsと進み、New repository secretから作成します。
以下の情報で作成して下さい。
- Name:
CODECOMMIT_SSH_PRIVATE_KEY_ID
- Value:SSHキー ID(先ほど控えたもの)
SSHのプライベートキーはローカルに作成されたものを確認しましょう。同じシェルで作成した場合は~/.ssh/test-ssh-key
から確認できます。
-----BEGIN OPENSSH PRIVATE KEY-----
から最後までをコピーします。
$ cat ~/.ssh/test-ssh-key -----BEGIN OPENSSH PRIVATE KEY----- ~ ~ ~ -----END OPENSSH PRIVATE KEY-----
コピーできたら以下の情報で保存します。
- Name:
CODECOMMIT_SSH_PRIVATE_KEY
- Value:SSHプライベートキー
GitHub Actionsを設定する
GitHubへPushするフォルダにGitHub Actionsの定義ファイル(main.yml)を作成します。今回は以下のフォルダ構成で作成しています。
. └ .github └ workflows └ main.yml
main.yml
に記述する内容は以下の通りです。は適宜変更してください。
name: Mirroring on: [ push, delete ] jobs: to_codecommit: runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v1 - uses: pixta-dev/repository-mirroring-action@v1 with: target_repo_url: ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/<CodeCommitのリポジトリ名> ssh_private_key: ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY }} ssh_username: ${{ secrets.CODECOMMIT_SSH_PRIVATE_KEY_ID }}
これで準備完了です。ミラーリングは以下を利用していて、サンプルからGitlabへのミラーリング部分は不要だったので削除しています。
Mirroring Repository · Actions · GitHub Marketplace
Pushしてミラーリングを確認する
それでは早速動作を確認してみます。その他のファイルを入れずにそのままPushしてみると、Actionsのタブからミラーリングされていることを確認できます。
テスト用に作成したCodeCommitのリポジトリを確認すると、ミラーリングされていることを確認できました。
別ブランチを作成してPushした場合や、マージした場合でもCodeCommitへのミラーリングが実行されます。
CodePipelineを実行する場合
CodeCommitをソースとしてCodePipelineを作成している場合、当たり前ですが、指定したブランチへの変更がない場合は動きません。逆にGitHubのマージからミラーリングが実行され、指定ブランチが変更された場合にはCodePipelineが実行されます。
例えば、CodePipelineのソースとしてmain
ブランチを指定した場合は以下の動きになります。
- GitHub上で別ブランチをPush→CodeCommitのリポジトリへミラーリング→CodePipelineは実行されない(mainブランチの変更がないため)
- GitHub上で別ブランチをmainブランチへマージ→CodeCommitのリポジトリへミラーリング→CodePipelineは実行される
後続でCodePipelineを実行する場合は意識しておきましょう。
おわりに
GitHubのリポジトリをCodeCommitへミラーリングしてCodePipelinewを動かしてみました。AWSのソリューション等を利用していて、CodeCommitを使う必要があるけどコード管理はGitHubで行いたいときにご活用ください。